package com.mercury.pattern._01_singleton.lazy.type03;

/**
 * 懒汉式3：线程安全且效率高
 */
public class SingletonTest03 {
    public static void main(String[] args) {
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance == instance2);
        System.out.println(instance.hashCode());
        System.out.println(instance2.hashCode());
    }
}

class Singleton{
    /**
     * 1、私有构造方法
     * 2、私有静态变量对象，用volatile 线程通知
     * 3、对象在调用方法的时候才会创建，用双端检查方式
     */
    private static volatile Singleton instance;

    private Singleton(){

    }

    public static  Singleton getInstance() {
        if(instance == null){
            synchronized (Singleton.class){ //保证进入下面方法时，只有一个线程
                if(instance == null){ //再次判断是否已经创建好了
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}
